package satk.database;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import satk.objetos.Evento;
import satk.beans.interfaces.IntControlManagerDB;

/**
 * Clase para manejar los torneos
 * @author Sergio Flores Genis <http://sergenis.x10.mx>, 17/04/2011
 */
public class ManagerEvento extends DBManager
        implements IntControlManagerDB<Evento> {

    public ManagerEvento(java.sql.Connection c) {
        super(c);
    }

    public ManagerEvento() {
        super();
    }

    /**
     * Obtiene todos los eventos registrados
     * @return Eventos registrados
     */
    @Override
    public List<Evento> getAll() {
        LinkedList<Evento> list;
        String query = "SELECT * FROM evento ORDER BY id_evento DESC;";
        try {
            ResultSet r = this.select(query);
            list = new LinkedList<Evento>();

            while (r.next()) {
                int identificador = r.getInt("id_evento");
                String organiza = r.getString("org_evento");
                String nombre = r.getString("nom_evento");
                String lugar = r.getString("lug_evento");
                Date fechaInicio = r.getDate("finicio_evento");
                Date fechaTermino = r.getDate("ftermino_evento");
                Date fechaCierreInscripcion = r.getDate("finscpcierre_evento");

                list.add(new Evento(identificador, organiza, nombre, lugar,
                        fechaInicio, fechaTermino, fechaCierreInscripcion));
            }
        } catch (Exception ex) {
            Logger.getLogger(ManagerEvento.class.getName()).log(Level.SEVERE,
                    "Error al obtener los torneos", ex);
            list = new LinkedList<Evento>();
        } finally {
            this.closeConexion();
        }
        return list;
    }

    @Override
    public Evento getById(long id) {
        String query = "SELECT * from evento WHERE (id_evento = ?);";
        DBManager.Prepare parametros = new DBManager.Prepare(1);
        parametros.add(id, Types.INTEGER);

        Evento evnt = new Evento();
        try {
            ResultSet r = this.select(query, parametros);
            r.first();
            evnt.setOrganizador(r.getString("org_evento").toUpperCase());
            evnt.setNombre(r.getString("nom_evento").toUpperCase());
            evnt.setLugar(r.getString("lug_evento"));
            evnt.setFechaInicio(r.getDate("finicio_evento"));
            evnt.setFechaTermino(r.getDate("ftermino_evento"));
            evnt.setFechaCierreInscripciones(r.getDate("finscpcierre_evento"));
            evnt.setIdentificador(r.getInt("id_evento"));
        } catch (SQLException ex) {
            Logger.getLogger(ManagerEvento.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            this.closeConexion();
        }
        return evnt;
    }

    @Override
    public int add(Evento evnt) throws SQLException {
        String query = "INSERT INTO evento ("
                + " org_evento, nom_evento, lug_evento,"
                + " finicio_evento, ftermino_evento, finscpcierre_evento)"
                + " VALUES (?, ?, ?, ?, ?, ?);";

        DBManager.Prepare parametros = new DBManager.Prepare(6);
        parametros.add(evnt.getOrganizador().toUpperCase(), Types.VARCHAR);
        parametros.add(evnt.getNombre().toUpperCase(), Types.VARCHAR);
        parametros.add(evnt.getLugar().toUpperCase(), Types.VARCHAR);
        parametros.add(evnt.getFechaInicio(), Types.DATE);
        parametros.add(evnt.getFechaTermino(), Types.DATE);
        parametros.add(evnt.getFechaCierreInscripciones(), Types.DATE);

        int resutl = this.edit(query.toString(), parametros);
        int idEvento = this.getLastIdInsert();
        evnt.setIdentificador(idEvento);
        this.closeConexion();
        return resutl;
    }

    @Override
    public int update(Evento o, Evento n) throws SQLException {
        StringBuilder nElemt = new StringBuilder();
        DBManager.PrepareUpdate parametros = new DBManager.PrepareUpdate();

        if (!n.getOrganizador().equals(o.getOrganizador())) {
            parametros.add("org_evento", n.getOrganizador(), Types.VARCHAR);
        }

        if (!n.getNombre().equals(o.getNombre())) {
            parametros.add("nom_evento", n.getNombre(), Types.VARCHAR);
        }

        if (!n.getLugar().equals(o.getLugar())) {
            parametros.add("lug_evento", n.getLugar(), Types.VARCHAR);
        }

        if (!n.getFechaInicio().equals(o.getFechaInicio())) {
            parametros.add("finicio_evento ", n.getFechaInicio(), Types.DATE);
        }

        if (!n.getFechaTermino().equals(o.getFechaTermino())) {
            parametros.add("ftermino_evento", n.getFechaTermino(), Types.DATE);
        }

        if (!n.getFechaCierreInscripciones().equals(o.getFechaCierreInscripciones())) {
            parametros.add("finscpcierre_evento", n.getFechaCierreInscripciones(), Types.DATE);
        }

        String query = String.format("UPDATE evento %s WHERE (id_evento = ?);",
                nElemt.substring(1));
        parametros.getPrepare().add(n.getIdentificador(), Types.INTEGER);

        int result = this.edit(query, parametros.getPrepare());
        this.closeConexion();
        return result;
    }

    /** <h1>No soportado</h1> */
    @Override
    public int remove(Evento o) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}